package com.zed.api.domain.currentuser;

import java.util.List;

/**
 * 会话
 *
 * @author Zed
 */
public interface Session {

    /**
     * 会话编号
     *
     * @return {@link String}
     */
    String getId();

    /**
     * 获取{@code name}对应的属性值
     *
     * @param name {@link String},属性名
     * @return {@link Object},可能返回null.
     */
    Object getAttribute(String name);

    /**
     * 获取{@code name}对应的属性值，并按{@code attrType}类型返回
     *
     * @param <A>
     * @param name     {@link String},属性名
     * @param attrType {@link Class},属性类型
     * @return {@link A},可能返回null.
     */
    default <A> A getAttribute(String name, Class<A> attrType) {
        Object result = this.getAttribute(name);
        return result == null ? null : attrType.cast(result);
    }

    /**
     * 设置属性
     *
     * @param name  {@link String},属性名
     * @param value {@link Object}, 属性值
     */
    void setAttribute(String name, Object value);

    /**
     * 所有属性名
     *
     * @return {@link List}
     */
    List<String> getAttributeNames();
}
